package com.sistemadistribucion.controlador;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import Interface.TDAManejoDatos; 
import DTO.*;
import Exception.*;

public class BDWeb 
{
		
	private TDAManejoDatos remote;
	private static BDWeb instancia;
	
	private BDWeb()
	{
		getStub();
	}
	
	public static BDWeb getInstancia()
	{
		if(instancia==null)
			instancia = new BDWeb();
		return instancia;
	}
	
	public boolean getStub()
	{
		try 
		{
			remote = (TDAManejoDatos)Naming.lookup ("//localhost/GestionLogisticaCentral");
			
			//System.setProperty("java.security.policy", "./conf.txt");
//			if (System.getSecurityManager() == null) {
//			            System.setSecurityManager(new SecurityManager());
//			        }
			
			System.out.println("Servicio Obtenido de la interfaz remota: " + TDAManejoDatos.url);
			
		return true;
			
		} catch (MalformedURLException e) {

			e.printStackTrace();
		} catch (RemoteException e) {

			e.printStackTrace();
		} catch (NotBoundException e) {

			e.printStackTrace();
		}
		
		return false;
	}


	public UsuarioVO validarUsuario(String usuario, String contrasena)
	{		
		try 
		{
			System.out.println("Llamo al RMI");
			UsuarioVO usu = remote.validarUsuario(usuario,contrasena);
			System.out.println("Devuelvo usuario");
			return usu;			
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		} 
		return null;
	}


	public int pagarFacturaClientePaticular(int idFactura, int idEncomienda){
		try 
		{
			remote.pagarFacturaParticular(idFactura, idEncomienda);
			return 1;
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return 0;
	}
	
	public int pagarFacturaClienteEmpresa(int idEncomienda, int idFactura, long cuit)
	{
		try 
		{
			return  remote.pagarFacturaEmpresa(idEncomienda, idFactura, cuit);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		} 
		return 0;
	}


	public Integer obtenerNumSucursalEmpleado(int dni)
	{
		try 
		{
			return  remote.buscaEmpleado(dni).getSucursal();
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return 0;
	}
	
	public String obtenerNomSucursalEmpleado(int sucursal)
	{
		try 
		{
			return remote.buscaSucursal(sucursal).getNombre();
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return "";
	}
	
	public EmpleadoVO buscarEmpleadoUsuario(UsuarioVO usu) throws RemoteException, NoExisteException 
	{
		return remote.buscaEmpleadoDeUsuario(usu.getUsuario());
	}
	
	//Clientes-----------------------------------------------------------------
	public void agregarClienteEmpresa(ClienteEmpresaVO eVO, DireccionVO dVO, CuentaCorrienteVO cVO) throws RemoteException
	{
		remote.agregarClienteEmpresa(eVO, dVO, cVO);
	}
	
	public ClienteEmpresaVO buscarClienteEmpresa(long cuit) throws RemoteException
	{
		return remote.buscaClienteEmpresa(cuit);
	}
	
	//Clientes-----------------------------------------------------------------
	public void agregarClienteParticula(ClienteParticularVO cpVO, DireccionVO dVO) throws RemoteException
	{
		remote.agregarClienteParticular(cpVO, dVO);
	}
	
	public ClienteParticularVO buscarClienteParticular(int dni) throws RemoteException
	{
		return remote.buscaClienteParticular(dni);
	}
	
	public Integer nuevaEncomienda(int idSucursal, EncomiendaVO encomiendaVO, ServicioVO servicio, DireccionVO origen, DireccionVO destino, DireccionVO actual){
		try {
			return remote.nuevaEncomienda(idSucursal, encomiendaVO, servicio, origen, destino, actual);
		} catch (IOException | URISyntaxException | NoExisteException e) {
			e.printStackTrace();
		}
		return 0;
	}	
	
	// devuelve el id de Direccion en BBDD tras crearse.
	// Si ya existe, devuelve el ID existente de Direccion en la BBDD
//	public int generarDireccion(DireccionVO dirvo){
//		DireccionVO dirEncontrada = remote.buscarDireccion(dirvo); 
//		if (dirEncontrada == null){
//			return remote.altaDireccion(dirvo);
//		}
//		return dirEncontrada.getIdDireccion();
//	}

//	public int generarServicioLogistica(String nombreServicio, float costoServicio) {
//		try {
//			int idSer = 0;
//			ServicioLogisticaVO serVO =  remote.buscaServicioLogistica(nombreServicio);
//			if (serVO == null){
//				idSer = remote.altaServicioLogistica(serVO);
//				
//			}
//			return serVO.getIdServicio();
//			
//		} catch (RemoteException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		return idSer;
//		
//		
//	}
//
//	public int generarServicioBasico(String nombreServicio, float costoServicio, boolean urgenteServicioBasico) {
//		try {
//			int idSer = 0;
//			ServicioBasicoVO serVO =  remote.buscaServicioBasico(nombreServicio);
//			if (serVO == null){
//				idSer = remote.altaServicioBasico(serVO);
//				
//			}
//			return serVO.getIdServicio();
//			
//		} catch (RemoteException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		return idSer;
//	}
//
//	public int generarServicioGranel(String nombreServicio, float costoServicio, float volumenServicioGranel,
//			try {
//				ServicioLogisticaVO serVO =  remote.buscaServicioLogistica(nombreServicio);
//				if (serVO == null){
//					remote.altaServicioLogistica(serVO);
//					
//				}
//				return serVO.getIdServicio();
//				
//			} catch (RemoteException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			return 0;
//	}
	
	public int altaEnvioInterno(boolean habilitado, String posActual, String patenteVeh,Date fechaSalida, Date fechaLlegada) 
	{
		try 
		{
			EnvioInternoVO eiVO = new EnvioInternoVO(0, posActual, habilitado, patenteVeh, 0, null, null, fechaLlegada, fechaSalida);
			return remote.altaEnvioInterno(eiVO);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return -1;
	}
	
	public int altaEnvioUrgente(String posActual, boolean habilitado, int idTracking, long cuit) 
	{
		try 
		{
			EnvioUrgenteVO euVO = new EnvioUrgenteVO(0, posActual, habilitado, null, idTracking, cuit);
			return remote.altaEnvioUrgente(euVO);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return -1;
	}
	

	public int altaEnvioInternacional(String posActual, boolean habilitado,int idTracking, long cuit) 
	{
		try 
		{
			EnvioInternacionalVO eiVO = new EnvioInternacionalVO(0, posActual, habilitado, null, idTracking, cuit);
			return remote.altaEnvioInternacional(eiVO);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return -1;
	}


	public ArrayList<ViajeVO> agregarEncomiendaAEnvio(int idEncomienda, int idEnvio, int idSuc) 
	{
		try 
		{
			return remote.agregarEncomiendaAEnvio(idEncomienda, idEnvio, idSuc);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
			return null;
		}
	}

	public void asociarEnvioASucursal(int eiID, int idSuc) 
	{
		try 
		{
			remote.asociarEnvioASucursal(eiID, idSuc);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
	}
	
	public boolean crearViajeInterSucursal(int idEncomienda, int idEnvio) 
	{
		try 
		{
			return remote.crearViajeInterSucursal(idEncomienda, idEnvio);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return false;
	}

	public boolean crearViajeOrigenSucursal(int idEncomienda, int idEnvio, int idSuc) 
	{
		try 
		{
			return remote.crearViajeOrigenSucursal(idEncomienda, idEnvio, idSuc);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return false;
	}

	public boolean crearViajeSucursalDestino(int idEncomienda, int idEnvio, int idSuc) 
	{
		try 
		{
			return remote.crearViajeSucursalDestino(idEncomienda, idEnvio, idSuc);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return false;
	}

	public int agregarPaqueteAEncomienda(int idEncomienda,	PaqueteVO paquete, ItemEnvioVO item) {
		try {
			return remote.agregarPaqueteAEncomienda(idEncomienda, paquete, item);
		} catch (RemoteException e) {

			e.printStackTrace();
		}
		return 0;

	}

	public int facturar(int idEncomienda) {
		try {
			return remote.facturar(idEncomienda);
		} catch (RemoteException e) {

			e.printStackTrace();
		}
		return 0;
	}

	public int agregarProductoLogistica(int idEncomienda,ProductoLogisticaVO prodlogVO) {
		try {
			return remote.agregarProductoLogistica(idEncomienda, prodlogVO);
		} catch (RemoteException e) {

			e.printStackTrace();
		}
		return 0;
	}

	public boolean asignarPlanMantenimiento(String patente, int idPlan) 
	{
		try 
		{
			return remote.asignarPlanMantenimiento(patente, idPlan);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
			return false;
		}
	}

	public Collection<TareaMantenimientoVO> aplicarPlanMantenimiento(String patente) 
	{
		try 
		{
			return remote.aplicarPlanMantenimiento(patente);
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
			return null;
		}
	}


	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	// De aca para abajo son metodos viejos
	
	/*

	
	//@SuppressWarnings("null")
		public Integer nuevaEncomiendaEmpresa(Integer idSucursal){
			//llamo por RMI a una funcion que con el numero de idEmpleado me da el idSucursal
		
			try {
				return  remote.nuevaEncomiendaEmpresa(idSucursal);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return 0;
		}	

	public Integer confirmarEncomiendaParticular(DTO_EncomiendaParticular enc){
		
		try {
			remote.confirmarEncomiendaParticular(enc);
			return remote.facturarEncomiendaParticular(enc.getId());
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}	
	
	public Integer confirmarEncomiendaEmpresa(DTO_EncomiendaEmpresa enc){
		
		try {
			remote.confirmarEncomiendaEmpresa(enc);
			return remote.facturarEncomiendaEmpresa(enc.getId());
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}

	public Integer ingresarEncomiendaParticularAStock(DTO_EncomiendaEnStock es){
		
		try {
			return remote.ingresarEncomiendaParticularAStock(es);
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}	
	
	public Integer ingresarEncomiendaEmpresaAStock(DTO_EncomiendaEnStock es){
		
		try {
			return remote.ingresarEncomiendaEmpresaAStock(es);
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}	
	
	
	
	public Integer egresarEncomiendaParticularDeStock(Integer idStock, Integer idEncomienda){
		
		try {
			return remote.egresarEncomiendaParticularDeStock(idStock,idEncomienda);
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}		
		
	
	public Integer egresarEncomiendaEmpresaDeStock(Integer idStock, Integer idEncomienda){
		
		try {
			return remote.egresarEncomiendaEmpresaDeStock(idStock,idEncomienda);
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}		
	
	
	public String getSucursalNombre(Integer id){
		
		try {
			DTO_Sucursal suc = remote.getSucursal(id);
			return suc.getDescripcion();
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "";
	}
	
	
	public List<DTO_Destino> listarDestinoNacional(Integer id){
		
		List<DTO_Destino> destinos = null; 
		
		try {
			destinos = remote.listarDestinoNacional(id);
			return destinos;
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return destinos;
	}	
	
	
	public Integer altaManifiesto(DTO_Manifiesto m){
		
		Integer idManifiesto;
		
		//llamo por RMI a una funcion que crea el manifiesto y me da el id
		//idManifiesto = altaManifiesto(m);
		
		idManifiesto = 70;
		
		return idManifiesto;
	}		
	
	//Clientes-----------------------------------------------------------------
	// TODO Completar el metodo	altaCliente
	public boolean altaCliente(dto.Cliente.DTO_Cliente cliente)
	{
		boolean resp = false;
		return true;
	}
	
	// TODO Completar el metodo	agregarDireccionEntrega
	public boolean agregarDireccionEntrega(int idCliente, dto.Cliente.DTO_DireccionEntrega direccionEntrega)
	{
		boolean resp = false;
		return true;
	}
	
	//Encomiendas--------------------------------------------------------------


	public Integer asignarEnvio(Integer idEncomienda) throws RemoteException 
	{
		return null;//remote.asignarEnvio(idEncomienda);
	}
	
	public boolean ingresarEncomiendaStockEnvio(Integer idEnvio, Integer idStock)
	{
		try 
		{
			remote.ingresarEncomiendaEnvio(idEnvio, idStock);
			return true;
			
		} 
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return false;
	}
	
	public boolean egresarEncomiendaStockEnvio(Integer idEnvio, Integer idStock)
	{
		try 
		{
			remote.egresarEncomiendaEnvio(idEnvio, idStock);
			return true;
			
		}
		catch (RemoteException e) 
		{
			e.printStackTrace();
		}
		return false;
	}
*/
}
